草庐IT

C++ union 与 reinterpret_cast

全部标签

c++ - 模板中的 const_cast。有 unconst 修饰符吗?

我有一个这样的模板类:templateclassMyClass{T*data;}有时,我想像下面这样使用具有常量类型T的类:MyClassmci;但我想使用const_castdata修改数据(为什么不重要,但MyClass是一个引用计数智能指针类,它将引用计数保存在数据本身中。MyObject派生自某种包含计数的类型。数据不应该被修改,但计数必须被智能指针修改。)。有没有办法从T中移除常量性??虚构代码:const_cast(data)? 最佳答案 这里最简单的方法是使引用计数可变。但是,如果您对它如何与const_cast一起工

c++ - Union 内部的奇怪行为类对象

您好,我想知道以下代码的原因voidmain(){classtest{public:test(){}intk;};classtest1{public:test1(){}intk;};unionTest{testt1;test1t2;};}对于上面的代码,它给出了错误“errorC2620:union'Test':member't1'hasuser-definedconstructorornon-trivialdefaultconstructor”classtest{public://test(){}intk;};classtest1{public://test()1{};intk;};

c++ - 为什么 static_cast 在逻辑上应该出于安全目的拒绝它们或者 static_cast 与安全无关时允许向下转换?

在下面的示例中,编译器接受static_cast向下转换,导致未定义的行为,而我认为static_cast完全是为了安全(C风格转换无法提供).#includeclassBase{public:intx=10;};classDerived1:publicBase{public:inty=20;};classDerived2:publicBase{public:intz=30;intw=40;};intmain(){Derived1d1;Base*bp1=static_cast(&d1);Derived2*dp1=static_cast(bp1);std::coutzw

c++ - dynamic_cast 是否在重载的运算符删除中工作?

我遇到了这个:structBase{void*operatornew(size_t);voidoperatordelete(void*);virtual~Base(){}//(p);if(dynamic_cast(pB)!=0){/*...NOTreachinghere?...*/}free(p);}现在如果我们这样做,Base*p=newDerived;deletep;令人惊讶的是,conditioninsidetheBase::deleteisnotsatisfied我做错了什么吗?或者从void*进行转换会丢失Derived*的信息? 最佳答案

c++ - 为什么这个 static_cast 是不允许的?

我有一个A类对象,我想将其分配到自定义堆栈对象上。为此,我只需将堆栈指针移动与对象大小相同的字节数并返回其先前的值:classA:publicB{};//Bisfromaprecompiledlibraryclassstack{public:stack(void):_top(&_storage[0]){}templateinlineT*push(void){T*ptr=static_cast(_top);_top+=sizeof(T);returnptr;}//...private:char_storage[1024];char*_top;};stack_stack;intmain(i

c++ - 带有构造函数的类的匿名 union/结构

即使我使用-std=c++11标志编译,GCC也会提示这段代码,而且我的gcc版本应该支持无限制union(>4.6)。union{struct{float4I,J,K,T;};struct{float4m_lines[4];};struct{floatm16f[16];};struct{floatm44f[4][4];};};请注意,float4有一个带0个参数的非默认构造函数。classfloat4{public:float4();....};知道我能做什么吗?错误是:::::I’withconstructornotallowedinanonymousaggregate

c++ - 包含可变结构的 union

这似乎类似于PODstructscontainingconstantmember,但有点相反。#includestructA{inta;};unionU{volatileAa;longb;};intmain(){Uu1;Uu2;u1.a.a=12;u2=u1;std::coutg++4.8.3编译这段代码没有错误并且运行正常:$g++-std=c++03a.cpp-oa_gcc$./a_gcc12但是clang++3.5.1产生了一个错误(我手动包装了错误消息以防止代码框滚动):$clang++-std=c++03a.cpp-oa_clanga.cpp:8:7:error:member

c++ - 将 union 与结构内的位字段结合使用的正确语法

我有以下一系列结构。structFooWord1{unsignedintFill:8;unsignedintsomeData1:18;unsignedintsomeData2:6;};structFooWord2{unsignedintFill:8;union{unsignedintA_Bit:1;unsignedintB_Bit:1;};unsignedintsomeData3:23;};structFoo_Data{FooWord1fooWord1;FooWord2fooWord2;FooWord3fooWord3;//similartoFooWord1FooWord4fooWor

c++ - dynamic_cast 何时因隐藏符号而失败?

根据关于可见性的gccwiki(https://gcc.gnu.org/wiki/Visibility,请参阅“C++异常问题(请阅读!)”)部分,但似乎也是一个示例(dynamic_castfailedwhenhidingsymbol),隐藏类可以导致有效的dynamic_cast失败。我想通过示例准确了解这种情况何时发生:任何人都可以给我一个小示例来正确理解效果吗?这是我的尝试和理解(在Linux上使用gcc>7):据我了解,我需要的是vaguelinkage发生,当基类没有关键方法时发生。所以我尝试了这个基本层次结构:classA{virtual~A();virtualvoidp

c# - C# 中的 C++ union — 奇怪的行为

我正在尝试使用C#中的VHDAPI创建一些vhd/vhdx文件。有一个看起来像这样的C++union:typedefstruct_CREATE_VIRTUAL_DISK_PARAMETERS{CREATE_VIRTUAL_DISK_VERSIONVersion;union{struct{GUIDUniqueId;ULONGLONGMaximumSize;ULONGBlockSizeInBytes;ULONGSectorSizeInBytes;PCWSTRParentPath;PCWSTRSourcePath;}Version1;struct{GUIDUniqueId;ULONGLONG